package es.us.lsi.daw.dao;

import java.util.Collection;
import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.springframework.dao.DataAccessException;
import org.springframework.ui.ModelMap;

import es.us.lsi.daw.model.util.BaseEntity;

public interface DAOComun {

	/********************************
	 *** Inicializando el sistema ***
	 *******************************/

	// Guardar un objetos
	public <T> boolean guardarObjeto(T obj) throws DataAccessException;

	public <T> void guardarListaObjetos(Collection<T> cllLista) throws DataAccessException;

	// Borrar objetos
	public <T> boolean borrarObjeto(T obj) throws DataAccessException;

	public <T> boolean borrarObjetos(Collection<T> cllObjs) throws DataAccessException;

	public <T extends BaseEntity> boolean borrarObjetoId(Class<T> clase, Long id);

	// Listados de objetos
	public <T> List<T> getListaClase(Class<T> clase);

	public <T> List<T> getListaClase(Class<T> clase, String lstLista) throws DataAccessException;

	// Filtro y busquedas
	public ModelMap filtroGenerico(Object filtro, Long pagina, String atributo);

	public ModelMap filtroGenerico(Object filtro, Long pagina, String atributo, Order orden);

	public ModelMap filtroGenerico(Object filtro, Long pagina, String atributo, Order orden, Class claseBusqueda);

	public ModelMap filtroGenerico(Object filtro, Long pagina, String atributo, Order orden, Class claseBusqueda, Integer numMaxRegistros);

	public <T> T obtenerObjetoId(Class<T> clase, Long id, String lstLista);

	public <T> T obtenerObjetoId(Class<T> clase, Long id);

	public boolean existe(Object o, Object valor, String atributo);
	
	public <T> boolean existeClase(Class<T> clase, Object valor, String atributo);

	public <T> List<T> filtroGenerico(Object filtro, String atributo);

	public Object filtroGenericoUnico(Object filtro, String atributo);

	public <T> T obtenerObjetoIdConListas(Class<T> clase, Long id, List<String> lstAtributos);

	// Auxiliares
	public <T> Long getSizeClase(Class<T> clase) throws DataAccessException;

	public SessionFactory getSessionFactory();
	
	/** Gets the current authenticated user's username */
	public String getCurrentUsername();
}
